#1. はじめに
ifconfig、route、netstat、arpなどのコマンドはRHEL7/CentOS7では最小構成では導入されていません。これらのコマンドは廃止予定になっており、代わりにipコマンドやssコマンドの利用が推奨されています。
しかし、ipコマンドのコマンド実行方法はよく紹介されていても、そもそもipコマンド結果をどのように解釈するべきなのかを説明しているドキュメントもあまり見かけない気がします。というので、今回はよく利用するip routeコマンドについてメモを残しておきます。
#2. ip routeコマンド
-
ip route
は経路情報を出力するコマンド。代わりにip r
でも良い。 - マニュアルを確認したい場合は、
man ip route
- Linux Kernelは複数のルーティングテーブルをサポートしている。デフォルトでは、localというLinux Kernelによって管理されているテーブルと、mainというテーブルが利用されており、他にもルーティングテーブルを作成することは可能。(defaultというテーブルも用意されているが、空っぽなので通常は気にしなくてよい)。
- 利用者が操作するのは主にmainテーブル。
ip route
のオプションに何も指定しなければ、mainテーブルを出力する。 - 他のtableを出力したければ、
ip route show table xxx
のように指定する。
- 利用者が操作するのは主にmainテーブル。
# ip r
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0 proto kernel scope link src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1 proto kernel scope link src 161.202.86.5
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
# ip r show table main
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0 proto kernel scope link src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1 proto kernel scope link src 161.202.86.5
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
- via xx.xx.xx.xx: ネクストホップのルーター
- dev: 対象デバイス
- proto kernel: (ユーザーが明示的に指定したのではなく)カーネルが自動生成した経路。例えば今回のケースでは、eth0やeth1にIPアドレスが割り振られている際において、ユーザーが明示的に指定しなくても各IPアドレスが所属するそれぞれの同一ネットワークへの経路は当然存在するため、自動生成されている。
- scope: destination(送信先)を指定
- scope link: 直接unicast/broadcastにて通信する経路。自身が属するネットワーク等が該当。
- scope host: 自分自身への経路
- scope global: (他ネットワークへの)ゲートウェイを経由したunicast通信による経路。scopeオプションがない時もこちらに該当。
- src: source(送信元)を指定
- 169.254.0.0/16: いわゆるリンクローカルアドレス。DHCPが利用できない際に、内部ネットワーク用に暫定的に割り当てることを意図したIPアドレス。サーバー用途では不要なため、
/etc/sysconfig/network
でNOZEROCONF=yes
を設定して削除することが多い。wikipediaなどでの解説とか、ここを参照。
# ip r show table local
broadcast 10.132.2.192 dev eth0 proto kernel scope link src 10.132.2.207
local 10.132.2.207 dev eth0 proto kernel scope host src 10.132.2.207
broadcast 10.132.2.255 dev eth0 proto kernel scope link src 10.132.2.207
broadcast 127.0.0.0 dev lo proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
broadcast 161.202.86.0 dev eth1 proto kernel scope link src 161.202.86.5
local 161.202.86.5 dev eth1 proto kernel scope host src 161.202.86.5
broadcast 161.202.86.31 dev eth1 proto kernel scope link src 161.202.86.5
- localテーブルはlocalアドレスとbroadcastアドレスへの経路から構成される。先述のとおり、localテーブルはkernelによって管理されており、全行とも
proto kernel
になっていることからもそのことが分かる。- local: interfaceにIPアドレスが付与されていた際に割り当てられる自分自身への経路。
- broadcast: interfaceにIPアドレスが付与されていた際に割り当てられるbroadcastへの経路。
# ip r show table all
default via 161.202.86.1 dev eth1
10.0.0.0/8 via 10.132.2.193 dev eth0
10.132.2.192/26 dev eth0 proto kernel scope link src 10.132.2.207
161.26.0.0/16 via 10.132.2.193 dev eth0
161.202.86.0/27 dev eth1 proto kernel scope link src 161.202.86.5
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
broadcast 10.132.2.192 dev eth0 table local proto kernel scope link src 10.132.2.207
local 10.132.2.207 dev eth0 table local proto kernel scope host src 10.132.2.207
broadcast 10.132.2.255 dev eth0 table local proto kernel scope link src 10.132.2.207
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 161.202.86.0 dev eth1 table local proto kernel scope link src 161.202.86.5
local 161.202.86.5 dev eth1 table local proto kernel scope host src 161.202.86.5
broadcast 161.202.86.31 dev eth1 table local proto kernel scope link src 161.202.86.5
unreachable ::/96 dev lo metric 1024 error -113
unreachable ::ffff:0.0.0.0/96 dev lo metric 1024 error -113
unreachable 2002:a00::/24 dev lo metric 1024 error -113
unreachable 2002:7f00::/24 dev lo metric 1024 error -113
unreachable 2002:a9fe::/32 dev lo metric 1024 error -113
unreachable 2002:ac10::/28 dev lo metric 1024 error -113
unreachable 2002:c0a8::/32 dev lo metric 1024 error -113
unreachable 2002:e000::/19 dev lo metric 1024 error -113
unreachable 3ffe:ffff::/32 dev lo metric 1024 error -113
fe80::/64 dev eth0 proto kernel metric 256
fe80::/64 dev eth1 proto kernel metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101
local ::1 dev lo table local proto none metric 0
local fe80::458:d5ff:fe6a:9a08 dev lo table local proto none metric 0
local fe80::482:4fff:fe85:836d dev lo table local proto none metric 0
ff00::/8 dev eth0 table local metric 256
ff00::/8 dev eth1 table local metric 256
unreachable default dev lo table unspec proto kernel metric 4294967295 error -101
#3. RPDB情報の確認
普通はmainテーブルぐらいしか構成しないのだが、過去にどうしてもパケットの挙動に納得できない環境があり、調査した結果他のテーブルが作られていることもあったので、初見の環境では念のためチェックしておいた方が良い。
- localテーブルやmainテーブル以外のテーブルを確認するためには、
ip rule
を実行する。これによって、RPDB(Routing Policy Database)の一覧が確認可能。 - localは0番に、mainは32766番に割り当てられている
- 番号が小さいテーブルから、順に評価される。
# ip rule
0: from all lookup local
32766: from all lookup main
32767: from all lookup default
#4. routelコマンド
routelコマンドはrouteコマンドの出力結果をフォーマットして表示してくれるコマンド。
もしこちらのコマンドが入っていたら、routelの方が見やすいかも。
# which routel
/usr/sbin/routel
# routel main
target gateway source proto scope dev tbl
default 161.202.86.1 eth1
10.0.0.0/ 8 10.132.2.193 eth0
10.132.2.192/ 26 10.132.2.207 kernel link eth0
161.26.0.0/ 16 10.132.2.193 eth0
161.202.86.0/ 27 161.202.86.5 kernel link eth1
169.254.0.0/ 16 link eth0
169.254.0.0/ 16 link eth1
# routel
target gateway source proto scope dev tbl
default 161.202.86.1 eth1
10.0.0.0/ 8 10.132.2.193 eth0
10.132.2.192/ 26 10.132.2.207 kernel link eth0
161.26.0.0/ 16 10.132.2.193 eth0
161.202.86.0/ 27 161.202.86.5 kernel link eth1
169.254.0.0/ 16 link eth0
169.254.0.0/ 16 link eth1
10.132.2.192 broadcast 10.132.2.207 kernel link eth0 local
10.132.2.207 local 10.132.2.207 kernel host eth0 local
10.132.2.255 broadcast 10.132.2.207 kernel link eth0 local
127.0.0.0 broadcast 127.0.0.1 kernel link lo local
127.0.0.0/ 8 local 127.0.0.1 kernel host lo local
127.0.0.1 local 127.0.0.1 kernel host lo local
127.255.255.255 broadcast 127.0.0.1 kernel link lo local
161.202.86.0 broadcast 161.202.86.5 kernel link eth1 local
161.202.86.5 local 161.202.86.5 kernel host eth1 local
161.202.86.31 broadcast 161.202.86.5 kernel link eth1 local
::/ 96 unreachable lo
::ffff:0.0.0.0/ 96 unreachable lo
2002:a00::/ 24 unreachable lo
2002:7f00::/ 24 unreachable lo
2002:a9fe::/ 32 unreachable lo
2002:ac10::/ 28 unreachable lo
2002:c0a8::/ 32 unreachable lo
2002:e000::/ 19 unreachable lo
3ffe:ffff::/ 32 unreachable lo
fe80::/ 64 kernel eth0
fe80::/ 64 kernel eth1
default unreachable kernel lo unspec
::1 local none lo local
fe80::458:d5ff:fe6a:9a08 local none lo local
fe80::482:4fff:fe85:836d local none lo local
ff00::/ 8 eth0 local
ff00::/ 8 eth1 local
default unreachable kernel lo unspec
#参考情報
http://linux-ip.net/html/routing-tables.html
http://linux-ip.net/html/tools-ip-address.html#tb-tools-ip-addr-scope
http://linux-ip.net/html/tools-ip-route.html